package com.explorati.design_pattern.behavior.interpreter;

import java.util.Stack;

/**
 * 环境(Context)角色：该角色提供解释器之外的一些全局信息
 * 
 * @author explorati
 *
 */
public class ExploratiExpressionParser {

	private Stack<Interpreter> stack = new Stack<Interpreter>();

	public int parse(String str) {
		String[] strItemArray = str.split(" ");
		for (String symbol : strItemArray) {
			if (!OperatorUtil.isOperator(symbol)) {
				Interpreter numberExpression = new NumberInterpreter(symbol);
				stack.push(numberExpression);
				System.out.println(String.format("入栈：%d", numberExpression.interpret()));
			} else {
				// 是运算符可以计算
				Interpreter firstExpression = stack.pop();
				Interpreter secondExpression = stack.pop();
				System.out.println(
						String.format("出栈：%d 和 %d", firstExpression.interpret(), secondExpression.interpret()));
				Interpreter operator = OperatorUtil.getExpressionObject(firstExpression, secondExpression, symbol);
				System.out.println(String.format("应用运算符：%s", operator));
				int result = operator.interpret();
				NumberInterpreter resultExpression = new NumberInterpreter(result);
				stack.push(resultExpression);
				System.out.println(String.format("阶段结果入栈：%d", resultExpression.interpret()));
			}
		}
		int result = stack.pop().interpret();
		return result;
	}
}
